/*
 * @Overview     : JsBridge
 * @Author       : Zi Jun
 * @Email        : zijun2030@163.com
 * @Date         : 2021-02-23 11:00:19
 * @LastEditTime : 2021-03-10 16:18:10
 * @LastEditors  : Zi Jun
 * @FilePath     : \simple-vite\src\utils\js-bridge\index.ts
 * @Mark         :
 * 用法：
 * import {callHandler, registerHandler} from '@/utils/js-bridge'
 *
 * 1、JS调用APP方法
 * callHandler(eventName, data, callback(responseData))
 * 参数说明：
 * eventName (string): 必传, 与 APP 端约定的事件名
 * data (object): 非必传, 发送给 APP 端的数据
 * callback (function): 通信完成后，前端的回调，responseData，是APP端返回的数据
 *
 * 2、APP调用JS方法
 * registerHandler(eventName, callback(data, responseCallback))
 * 参数说明：
 * eventName (string): 必传，与 APP 端约定的事件名
 * callback (function): data: 是接收到的数据，responseCallback，通信完成后，传给 APP 端的回调
 */

import { getBrowser } from '@/utils/methods/common';

const setupWebViewJavascriptBridge = (callback) => {
	// Android使用
	if (getBrowser().isAndroid && getBrowser().isApp) {
		if (window.WebViewJavascriptBridge) {
			callback(window.WebViewJavascriptBridge);
		} else {
			document.addEventListener(
				'WebViewJavascriptBridgeReady',
				function () {
					callback(window.WebViewJavascriptBridge);
				},
				false,
			);
		}
	}
	// iOS使用
	if (getBrowser().isIos && getBrowser().isApp) {
		if (window.WebViewJavascriptBridge) {
			return callback(window.WebViewJavascriptBridge);
		}
		if (window.WVJBCallbacks) {
			return window.WVJBCallbacks.push(callback);
		}
		window.WVJBCallbacks = [callback];
		const WVJBIframe = document.createElement('iframe');
		WVJBIframe.style.display = 'none';
		WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
		document.documentElement.appendChild(WVJBIframe);
		setTimeout(function () {
			document.documentElement.removeChild(WVJBIframe);
		}, 0);
	}
};

// 注册回调函数，第一次连接时调用 初始化函数(android需要初始化,ios不用)
setupWebViewJavascriptBridge(function (bridge) {
	if (getBrowser().isAndroid && getBrowser().isApp) {
		//初始化
		bridge.init(function (_message, responseCallback) {
			const data = {
				'Javascript Responds': 'Wee!',
			};
			responseCallback(data);
		});
	}
});

// JS调用APP方法
export const callHandler = (name, data?: any, callback?: any) => {
	setupWebViewJavascriptBridge(function (bridge) {
		bridge.callHandler(name, data, callback);
	});
};

// APP调用JS方法
export const registerHandler = (name, callback) => {
	setupWebViewJavascriptBridge(function (bridge) {
		bridge.registerHandler(name, function (data, responseCallback) {
			callback(data, responseCallback);
		});
	});
};
